#include "com/com_connect.hpp"

ComConnect::ComConnect(QObject *parent) : QObject(parent) {
  this->serial = new QSerialPort(this);
  this->connect_status = false;
}

ComConnect::~ComConnect() {
  this->closeCom();
  delete serial;
}

/**
 * 使用Qt初始化串口
 * @param comPort 串口名称（如"COM3"）
 * @param index com口下标
 * @param is_connect 确认是否连接
 * @param baudRate 波特率（如115200）
 * @return 成功返回true，失败返回false
 */
bool ComConnect::initComPort(const QString &comPort, int index, bool is_connect,qint32 baudRate) {
  if (!this->serial) {
    qDebug() << "未获取到串口对象,请检查设备,并且选择com";
    return false;
  }
  // 如果串口已经打开，先关闭
  if (this->serial->isOpen()) {
    this->serial->close();
  }
  // 保存波特率
  this->baudRate = baudRate;
  if (is_connect) {
    // 设置串口名称
    this->serial->setPortName(comPort);
    // 设置波特率
    this->serial->setBaudRate(baudRate);
    // 设置数据位
    this->serial->setDataBits(QSerialPort::Data8);
    // 设置校验位
    this->serial->setParity(QSerialPort::NoParity);
    // 设置停止位
    this->serial->setStopBits(QSerialPort::OneStop);
    // 设置流控制
    this->serial->setFlowControl(QSerialPort::NoFlowControl);
    // 打开串口
    if (this->serial->open(QIODevice::ReadWrite)) {
      qDebug() << "串口" << comPort << "初始化成功（波特率：" << baudRate << ")";
      this->connect_status = true;
      return true;
    } else {
      qDebug() << "打开串口" << comPort << "失败：" << this->serial->errorString();
      return false;
    }
  }
  else {
    qDebug() << "未连接串口";
    return false;
  }
}

void ComConnect::closeCom() {
  if (connect_status) {
    serial->close();
    connect_status = false;
    qDebug() << "关闭串口成功";
  } else {
    qDebug() << "未连接串口，无需关闭";
  }
}

QSerialPort *ComConnect::getSerialP() { return this->serial; }

bool ComConnect::getConnectStatus() { return this->connect_status; }

qint32 ComConnect::getBaudRate() { return this->baudRate; }